﻿using System;
using System.Collections.Generic;
using System.Text;

namespace DBHelper
{
    public  class CommonAccess<T> : IRepository<T> where T:EntityBase
    {
        IDatabase innerBase;
        public CommonAccess(IDatabase db)
        {
            innerBase = db;
        }
        public Database Helper { get { return innerBase.GetInstance(); } }
        public bool IsNew(T obj) { return Helper.IsNew(obj); }
        public object Insert(T obj) { return Helper.Insert(obj); }
        public int Update(T obj, IEnumerable<string> columns) { return Helper.Update(obj, columns); }
        //public int Update(string sql, params object[] args) { return Helper.Update<T>(sql, args); }
        //public  int Update(Sql sql) { return Helper.Update<T>(sql); }
        public int Delete(T obj) { return Helper.Delete(obj); }
        //public  int Delete(string sql, params object[] args) { return Helper.Delete<T>(sql, args); }
        //public  int Delete(Sql sql) { return Helper.Delete<T>(sql); }
        public int Delete(object primaryKey) { return Helper.Delete<T>(primaryKey); }
        public bool Exists(object primaryKey) { return Helper.Exists<T>(primaryKey); }
        public T SingleOrDefault(object primaryKey) { return Helper.SingleOrDefault<T>(primaryKey); }
        //public  T SingleOrDefault(string sql, params object[] args) { return Helper.SingleOrDefault<T>(sql, args); }
        //public  T SingleOrDefault(Sql sql) { return Helper.SingleOrDefault<T>(sql); }
        //public  T FirstOrDefault(string sql, params object[] args) { return Helper.FirstOrDefault<T>(sql, args); }
        //public  T FirstOrDefault(Sql sql) { return Helper.FirstOrDefault<T>(sql); }
        public T Single(object primaryKey) { return Helper.Single<T>(primaryKey); }
        //public  T Single(string sql, params object[] args) { return Helper.Single<T>(sql, args); }
        //public  T Single(Sql sql) { return Helper.Single<T>(sql); }
        //public  T First(string sql, params object[] args) { return Helper.First<T>(sql, args); }
        //public  T First(Sql sql) { return Helper.First<T>(sql); }
        //public  List<T> Fetch(string sql, params object[] args) { return Helper.Fetch<T>(sql, args); }
        //public  List<T> Fetch(Sql sql) { return Helper.Fetch<T>(sql); }
        //public  List<T> Fetch(long page, long itemsPerPage, string sql, params object[] args) { return Helper.Fetch<T>(page, itemsPerPage, sql, args); }
        //public  List<T> Fetch(long page, long itemsPerPage, Sql sql) { return Helper.Fetch<T>(page, itemsPerPage, sql); }
        //public  List<T> SkipTake(long skip, long take, string sql, params object[] args) { return Helper.SkipTake<T>(skip, take, sql, args); }
        //public  List<T> SkipTake(long skip, long take, Sql sql) { return Helper.SkipTake<T>(skip, take, sql); }
        //public  Page<T> Page(long page, long itemsPerPage, string sql, params object[] args) { return Helper.Page<T>(page, itemsPerPage, sql, args); }
        //public  Page<T> Page(long page, long itemsPerPage, Sql sql) { return Helper.Page<T>(page, itemsPerPage, sql); }
        //public  List<T> Query(string sql, params object[] args) { return Helper.Query<T>(sql, args); }
        //public  List<T> Query(Sql sql) { return Helper.Query<T>(sql); }

        public List<T> FindAll()
        {
            return Helper.Query<T>("");
        }
      
        public int Update(T k)
        {
            if (k.ModifiedColumns == null)
                return Helper.Update(this);
           
            int retv = Helper.Update(k, k.ModifiedColumns.Keys);
            k.ModifiedColumns.Clear();
            return retv;
        }
        public void Save(T k)
        {
            if (Helper.IsNew(k))
                Helper.Insert(k);
            else
                Update(k);
        }
    }

   
}
